home *** CD-ROM | disk | FTP | other *** search
/ Aminet 44 / Aminet 44 (2001)(GTI - Schatztruhe)[!][Aug 2001].iso / Aminet / dev / moni / systemviewer.lha / SysVectors.c < prev   
C/C++ Source or Header  |  2001-04-25  |  15KB  |  629 lines

  1. /****h* SysViewer/SysVectors.c [1.1] **********************************
  2. *
  3. * NAME
  4. *    SysVectors.c
  5. *
  6. * DESCRIPTION
  7. *    Display the following info from ExecBase:
  8. *
  9. *      ->SoftVer;
  10. *      ->ColdCapture;
  11. *      ->CoolCapture;
  12. *      ->WarmCapture;
  13. *      ->DebugEntry;
  14. *      ->DebugData;
  15. *      ->TaskTrapCode;
  16. *      ->TaskExceptCode;
  17. *      ->KickMemPtr;
  18. *      ->KickTagPtr;
  19. *      ->KickCheckSum;
  20. *
  21. * FUNCTIONAL INTERFACE:
  22. *    PUBLIC int ShowVectors( void );
  23. *
  24. **********************************************************************
  25. *
  26. */
  27.  
  28. #include <string.h>
  29.  
  30. #include <exec/types.h>
  31. #include <exec/execbase.h>
  32.  
  33. #include <intuition/intuition.h>
  34. #include <intuition/classes.h>
  35. #include <intuition/classusr.h>
  36. #include <intuition/gadgetclass.h>
  37.  
  38. #include <libraries/gadtools.h>
  39.  
  40. #include <graphics/displayinfo.h>
  41. #include <graphics/gfxbase.h>
  42.  
  43. #include <clib/exec_protos.h>
  44. #include <clib/intuition_protos.h>
  45. #include <clib/gadtools_protos.h>
  46. #include <clib/graphics_protos.h>
  47. #include <clib/utility_protos.h>
  48. #include <clib/diskfont_protos.h>
  49.  
  50. #include "CPGM:GlobalObjects/CommonFuncs.h"
  51.  
  52. #include "SysLists.h"
  53.  
  54. #define VLV     0
  55. #define Clear   1
  56. #define Cancel  2
  57.  
  58. #define Vec_CNT 3
  59.  
  60. IMPORT struct ExecBase *SysBase; // setup by SAS-C.
  61. IMPORT struct Screen   *Scr;
  62.  
  63. PRIVATE char ver[] = "\0$VER: SysVectors 1.1 (25-Apr-2001) by J.T. Steichen\0";
  64.  
  65. PRIVATE struct TextFont *VecFont = NULL;
  66.  
  67. PRIVATE struct Window       *VecWnd   = NULL;
  68. PRIVATE struct Gadget       *VecGList = NULL;
  69. PRIVATE struct IntuiMessage  VecMsg;
  70. PRIVATE struct Gadget       *VecGadgets[ Vec_CNT ];
  71.  
  72. PRIVATE UWORD  VecLeft   = 0;
  73. PRIVATE UWORD  VecTop    = 16;
  74. PRIVATE UWORD  VecWidth  = 635;
  75. PRIVATE UWORD  VecHeight = 230;
  76. PRIVATE UBYTE *VecWdt    = "System Vectors Info:";
  77.  
  78. PRIVATE char tstr[] = "Address     Contents    Name";
  79. PRIVATE char fmt[]  = "%08LX -> %08LX -> %-50.50s";
  80.  
  81. // -----------------------------------------------------------------
  82.  
  83. #define MAXNODES   15
  84. #define NODELENGTH 80
  85.  
  86. PRIVATE struct List VecList;
  87. PRIVATE struct Node VecNodes[ MAXNODES ]              = { NULL, };
  88. PRIVATE UBYTE       NodeStrs[ MAXNODES * NODELENGTH ] = "";
  89.  
  90. PRIVATE struct ListViewMem lvm = { 0, };
  91.     
  92. // -----------------------------------------------------------------
  93.  
  94. PRIVATE UWORD VecGTypes[] = {
  95.  
  96.    LISTVIEW_KIND,   BUTTON_KIND,   BUTTON_KIND
  97. };
  98.  
  99. PRIVATE int VLVClicked(    int whichitem );
  100. PRIVATE int ClearClicked(  int dummy     );
  101. PRIVATE int CancelClicked( int dummy     );
  102.  
  103. PRIVATE struct NewGadget VecNGad[] = {
  104.  
  105.      2,   3, 627, 200,                NULL, NULL, VLV,               0, 
  106.    NULL, (APTR) VLVClicked,
  107.  
  108.    317, 205,  72,  17, (UBYTE *) "Clear",   NULL, Clear,  PLACETEXT_IN,
  109.    NULL, (APTR) ClearClicked,
  110.  
  111.    554, 205,  72,  17, (UBYTE *) "_Cancel", NULL, Cancel, PLACETEXT_IN,
  112.    NULL, (APTR) CancelClicked
  113. };
  114.  
  115. PRIVATE ULONG VecGTags[] = {
  116.  
  117.    GTLV_ShowSelected, NULL, LAYOUTA_Spacing, 2, TAG_DONE,
  118.  
  119.    GA_Disabled,     TRUE, TAG_DONE,
  120.    GT_Underscore,   '_',  TAG_DONE
  121. };
  122.  
  123. PRIVATE APTR  Vectors[ MAXNODES ] = { 0, };
  124.  
  125. PRIVATE ULONG VecAddress = 0L; // What did User click on?
  126.  
  127. // -----------------------------------------------------------------
  128.  
  129. PRIVATE void SetupVectorList( void )
  130. {
  131.    IMPORT struct ExecBase *SysBase;
  132.  
  133.    int i = 0;
  134.  
  135.    sprintf( &NodeStrs[ i++ ], "%s", &tstr[0] ); // Title of contents.
  136.       
  137.    Forbid();
  138.    
  139.       Vectors[0 ] = (APTR) SysBase->SoftVer;
  140.       Vectors[1 ] = SysBase->ColdCapture;
  141.       Vectors[2 ] = SysBase->CoolCapture;
  142.       Vectors[3 ] = SysBase->WarmCapture;
  143.       Vectors[4 ] = SysBase->DebugEntry;
  144.       Vectors[5 ] = SysBase->DebugData;
  145.       Vectors[6 ] = SysBase->TaskTrapCode;
  146.       Vectors[7 ] = SysBase->TaskExceptCode;
  147.       Vectors[8 ] = SysBase->KickMemPtr;
  148.       Vectors[9 ] = SysBase->KickTagPtr;
  149.       Vectors[10] = SysBase->KickCheckSum;
  150.  
  151.       sprintf( &NodeStrs[ i++ * NODELENGTH ], &fmt[0],
  152.                &(SysBase->SoftVer), Vectors[0], "Software Version" 
  153.              );
  154.  
  155.       sprintf( &NodeStrs[ i++ * NODELENGTH ], &fmt[0],
  156.                &(SysBase->ColdCapture), Vectors[1], "Cold Capture" 
  157.              );
  158.  
  159.       sprintf( &NodeStrs[ i++ * NODELENGTH ], &fmt[0],
  160.                &(SysBase->CoolCapture), Vectors[2], "Cool Capture" 
  161.              );
  162.  
  163.       sprintf( &NodeStrs[ i++ * NODELENGTH ], &fmt[0],
  164.                &(SysBase->WarmCapture), Vectors[3], "Warm Capture" 
  165.              );
  166.  
  167.       sprintf( &NodeStrs[ i++ * NODELENGTH ], &fmt[0],
  168.                &(SysBase->DebugEntry), Vectors[4], "Debug Entry point" 
  169.              );
  170.  
  171.       sprintf( &NodeStrs[ i++ * NODELENGTH ], &fmt[0],
  172.                &(SysBase->DebugData), Vectors[5], "Debug Data start" 
  173.              );
  174.  
  175.       sprintf( &NodeStrs[ i++ * NODELENGTH ], &fmt[0],
  176.                &(SysBase->TaskTrapCode), Vectors[6], "Task Trap Code start"
  177.              );
  178.  
  179.       sprintf( &NodeStrs[ i++ * NODELENGTH ], &fmt[0],
  180.                &(SysBase->TaskExceptCode), Vectors[7], 
  181.                "Task Exception Code start"
  182.              );
  183.  
  184.       sprintf( &NodeStrs[ i++ * NODELENGTH ], &fmt[0],
  185.                &(SysBase->KickMemPtr), Vectors[8], "Kick Memory pointer"
  186.              );
  187.  
  188.       sprintf( &NodeStrs[ i++ * NODELENGTH ], &fmt[0],
  189.                &(SysBase->KickTagPtr), Vectors[9], "Kick Tag pointer"
  190.              );
  191.  
  192.       sprintf( &NodeStrs[ i++ * NODELENGTH ], &fmt[0],
  193.                &(SysBase->KickCheckSum), Vectors[10], 
  194.                "Kick Memory CheckSum"
  195.              );
  196.  
  197.    Permit();
  198.  
  199.    return;
  200. }
  201.  
  202.  
  203. PRIVATE void CloseVecWindow( void )
  204. {
  205.    if (VecWnd != NULL)
  206.       {
  207.       CloseWindow( VecWnd );
  208.       VecWnd = NULL;
  209.       }
  210.  
  211.    if (VecGList != NULL)
  212.       {
  213.       FreeGadgets( VecGList );
  214.       VecGList = NULL;
  215.       }
  216.  
  217.    if (VecFont != NULL)
  218.       {
  219.       CloseFont( VecFont );
  220.       VecFont = NULL;
  221.       }
  222.  
  223.    return;
  224. }
  225.  
  226. PRIVATE int VecCloseWindow( void )
  227. {
  228.    CloseVecWindow();
  229.    return( (int) FALSE );
  230. }
  231.  
  232. PRIVATE int VLVClicked( int whichitem )
  233. {
  234.    ULONG addr = 0L;
  235.  
  236. //#  ifdef DEBUG
  237. //   fprintf( stderr, "%-80.80s\n", VecNodes[ whichitem ].ln_Name );
  238. //#  endif
  239.  
  240.    if (whichitem != 0)
  241.       {
  242.       GT_SetGadgetAttrs( VecGadgets[ Clear ], VecWnd, NULL,
  243.                          GA_Disabled, FALSE, TAG_DONE
  244.                        );
  245.  
  246.       // Now get address from the item:
  247.       (void) stch_l( VecNodes[ whichitem ].ln_Name, (long *) &addr );
  248.  
  249.       VecAddress = addr;
  250.       }
  251.    else
  252.       {
  253.       GT_SetGadgetAttrs( VecGadgets[ Clear ], VecWnd, NULL,
  254.                          GA_Disabled, TRUE, TAG_DONE
  255.                        );
  256.       
  257.       VecAddress = 0;
  258.       }
  259.  
  260.    return( (int) TRUE );
  261. }
  262.  
  263. PRIVATE int ClearAVector( ULONG vaddress )
  264. {
  265.    int rval = TRUE;
  266.  
  267.    Forbid();
  268.  
  269.       if (vaddress == (ULONG) &SysBase->SoftVer)
  270.          { 
  271.          Vectors[0]                    = 0;
  272.          *((char *) &SysBase->SoftVer) = 0;
  273.  
  274.          Permit();
  275.          }
  276.       else if (vaddress == (ULONG) &SysBase->ColdCapture)
  277.          {
  278.          Vectors[1]                        = 0;
  279.          *((char *) &SysBase->ColdCapture) = 0;
  280.  
  281.          Permit();
  282.          }
  283.       else if (vaddress == (ULONG) &SysBase->CoolCapture)
  284.          {
  285.          Vectors[2]                        = 0;
  286.          *((char *) &SysBase->CoolCapture) = 0;
  287.  
  288.          Permit();
  289.          }
  290.       else if (vaddress == (ULONG) &SysBase->WarmCapture)
  291.          {
  292.          Vectors[3]                        = 0;
  293.          *((char *) &SysBase->WarmCapture) = 0;
  294.  
  295.          Permit();
  296.          }
  297.       else if (vaddress == (ULONG) &SysBase->DebugEntry)
  298.          {
  299.          Vectors[4]                       = 0;
  300.          *((char *) &SysBase->DebugEntry) = 0;
  301.  
  302.          Permit();
  303.          }
  304.       else if (vaddress == (ULONG) &SysBase->DebugData)
  305.          {
  306.          Vectors[5]                      = 0;
  307.          *((char *) &SysBase->DebugData) = 0;
  308.  
  309.          Permit();
  310.          }
  311.       else if (vaddress == (ULONG) &SysBase->TaskTrapCode)
  312.          {
  313.          Vectors[6]                         = 0;
  314.          *((char *) &SysBase->TaskTrapCode) = 0;
  315.  
  316.          Permit();
  317.          }
  318.       else if (vaddress == (ULONG) &SysBase->TaskExceptCode)
  319.          {
  320.          Vectors[7]                           = 0;
  321.          *((char *) &SysBase->TaskExceptCode) = 0;
  322.  
  323.          Permit();
  324.          }
  325.       else if (vaddress == (ULONG) &SysBase->KickMemPtr)
  326.          {
  327.          Vectors[8]                       = 0;
  328.          *((char *) &SysBase->KickMemPtr) = 0;
  329.  
  330.          Permit();
  331.          }
  332.       else if (vaddress == (ULONG) &SysBase->KickTagPtr)
  333.          {
  334.          Vectors[9]                       = 0;
  335.          *((char *) &SysBase->KickTagPtr) = 0;
  336.  
  337.          Permit();
  338.          }
  339.       else if (vaddress == (ULONG) &SysBase->KickCheckSum)
  340.          {
  341.          Vectors[10]                        = 0;
  342.          *((char *) &SysBase->KickCheckSum) = 0;
  343.       
  344.          Permit();
  345.          }
  346.       else
  347.          {
  348.          int ans = 0;
  349.  
  350.          Permit();          
  351.  
  352.          sprintf( ErrMsg, "Unknown vector in ClearAVector()!\n"
  353.                           "Continue?" 
  354.                 );
  355.  
  356.          ans = Handle_Problem( ErrMsg, "Program ERROR!", NULL );
  357.          
  358.          if (ans != 0)
  359.             rval = FALSE;
  360.          }
  361.  
  362.    return( rval );
  363. }
  364.  
  365. PRIVATE int ClearClicked( int dummy )
  366. {
  367.    int rval = TRUE;
  368.  
  369.    if (VecAddress == 0)
  370.       {
  371.       UserInfo( "Select a Vector to clear first!", "User ERROR:" );
  372.       
  373.       return( rval );
  374.       }
  375.    else
  376.       {
  377.       int ans = 0;
  378.       
  379.       sprintf( ErrMsg, "WARNING!:  What you're about to do may\n"
  380.                        "           CRASH the Operating System!"
  381.                        "   Continue?" 
  382.              );
  383.  
  384.       ans = Handle_Problem( ErrMsg, "User Sanity Check:", NULL );
  385.  
  386.       if (ans != 0)
  387.          return( rval );
  388.       }
  389.  
  390.    // Crazy User decided to Continue!:
  391.  
  392.    HideListFromView( VecGadgets[ VLV ], VecWnd );
  393.  
  394.    rval = ClearAVector( VecAddress );
  395.    
  396.    SetupVectorList(); // Make the list.
  397.  
  398.    ModifyListView( VecGadgets[ VLV ], VecWnd, 
  399.                    (struct List *) &VecList, NULL
  400.                  );
  401.  
  402.    GT_RefreshWindow( VecWnd, NULL );
  403.  
  404.    return( rval );
  405. }
  406.  
  407. PRIVATE int CancelClicked( int dummy )
  408. {
  409.    return( VecCloseWindow() );
  410. }
  411.  
  412. // ------------------------------------------------------------------
  413.  
  414. PRIVATE int OpenVecWindow( void )
  415. {
  416.    struct NewGadget  ng;
  417.    struct Gadget    *g;
  418.    UWORD             lc, tc;
  419.    UWORD             wleft = VecLeft, wtop = VecTop, ww, wh;
  420.  
  421.    ComputeFont( Scr, Font, &CFont, VecWidth, VecHeight );
  422.  
  423.    ww = ComputeX( CFont.FontX, VecWidth );
  424.    wh = ComputeY( CFont.FontY, VecHeight );
  425.  
  426.    if ((wleft + ww + CFont.OffX + Scr->WBorRight) > Scr->Width)
  427.       wleft = Scr->Width - ww;
  428.  
  429.    if ((wtop + wh + CFont.OffY + Scr->WBorBottom) > Scr->Height)
  430.       wtop = Scr->Height - wh;
  431.  
  432.    if ((VecFont = OpenDiskFont( Font )) == NULL)
  433.       return( -5 );
  434.  
  435.    if ((g = CreateContext( &VecGList )) == NULL)
  436.       return( -1 );
  437.  
  438.    for (lc = 0, tc = 0; lc < Vec_CNT; lc++)
  439.       {
  440.       CopyMem( (char *) &VecNGad[lc], (char *) &ng, 
  441.                (long) sizeof( struct NewGadget )
  442.              );
  443.  
  444.       ng.ng_VisualInfo = VisualInfo;
  445.       ng.ng_TextAttr   = Font;
  446.  
  447.       ng.ng_LeftEdge   = CFont.OffX + ComputeX( CFont.FontX, 
  448.                                                 ng.ng_LeftEdge
  449.                                               );
  450.  
  451.       ng.ng_TopEdge    = CFont.OffY + ComputeY( CFont.FontY, 
  452.                                                 ng.ng_TopEdge
  453.                                               );
  454.  
  455.       ng.ng_Width      = ComputeX( CFont.FontX, ng.ng_Width );
  456.       ng.ng_Height     = ComputeY( CFont.FontY, ng.ng_Height );
  457.  
  458.       VecGadgets[lc] = g = CreateGadgetA( (ULONG) VecGTypes[lc], 
  459.                              g, 
  460.                              &ng, 
  461.                              (struct TagItem *) &VecGTags[tc] );
  462.  
  463.       while (VecGTags[tc] != NULL)
  464.          tc += 2;
  465.  
  466.       tc++;
  467.  
  468.       if (NOT g)
  469.          return( -2 );
  470.       }
  471.  
  472.    if ((VecWnd = OpenWindowTags( NULL,
  473.  
  474.                    WA_Left,        wleft,
  475.                    WA_Top,         wtop,
  476.                    WA_Width,       ww + CFont.OffX + Scr->WBorRight,
  477.                    WA_Height,      wh + CFont.OffY + Scr->WBorBottom,
  478.                    
  479.                    WA_IDCMP,       LISTVIEWIDCMP | BUTTONIDCMP 
  480.                      | IDCMP_CLOSEWINDOW | IDCMP_REFRESHWINDOW 
  481.                      | IDCMP_VANILLAKEY,
  482.  
  483.                    WA_Flags,       WFLG_DRAGBAR | WFLG_DEPTHGADGET 
  484.                      | WFLG_CLOSEGADGET | WFLG_SMART_REFRESH 
  485.                      | WFLG_ACTIVATE | WFLG_RMBTRAP,
  486.                    
  487.                    WA_Gadgets,     VecGList,
  488.                    WA_Title,       VecWdt,
  489.                    WA_ScreenTitle, ScrTitle,
  490.                    TAG_DONE )
  491.       ) == NULL)
  492.       return( -4 );
  493.  
  494.    GT_RefreshWindow( VecWnd, NULL );
  495.  
  496.    return( 0L );
  497. }
  498.  
  499. PRIVATE int VecVanillaKey( int whichkey )
  500. {
  501.    int rval = TRUE;
  502.    
  503.    switch (whichkey)
  504.       {
  505.       case 'c':
  506.       case 'C':
  507.       case 'x':
  508.       case 'X':
  509.       case 'q':
  510.       case 'Q':
  511.          rval = CancelClicked( 0 );
  512.          break;
  513.          
  514.       default:
  515.          break;
  516.       }
  517.       
  518.    return( rval );
  519. }
  520.  
  521. PRIVATE int HandleVecIDCMP( void )
  522. {
  523.    struct IntuiMessage  *m;
  524.    int                 (*func)( int code );
  525.    BOOL                  running = TRUE;
  526.  
  527.    while (running == TRUE)
  528.       {
  529.       if ((m = GT_GetIMsg( VecWnd->UserPort )) == NULL)
  530.          {
  531.          (void) Wait( 1L << VecWnd->UserPort->mp_SigBit );
  532.          continue;
  533.          }
  534.  
  535.       CopyMem( (char *) m, (char *) &VecMsg, 
  536.                (long) sizeof( struct IntuiMessage )
  537.              );
  538.  
  539.       GT_ReplyIMsg( m );
  540.  
  541.       switch (VecMsg.Class)
  542.          {
  543.          case IDCMP_REFRESHWINDOW:
  544.             GT_BeginRefresh( VecWnd );
  545.             GT_EndRefresh( VecWnd, TRUE );
  546.             break;
  547.  
  548.          case IDCMP_CLOSEWINDOW:
  549.             running = VecCloseWindow();
  550.             break;
  551.  
  552.          case IDCMP_VANILLAKEY:
  553.             running = VecVanillaKey( (int) VecMsg.Code );
  554.             break;
  555.             
  556.          case IDCMP_GADGETUP:
  557.          case IDCMP_GADGETDOWN:
  558.             func = (void *) ((struct Gadget *) VecMsg.IAddress)->UserData;
  559.             if (func != NULL)
  560.                running = func( (int) VecMsg.Code );
  561.  
  562.             break;
  563.          }
  564.       }
  565.  
  566.    return( running );
  567. }
  568.  
  569. PUBLIC int HandleVectorLV( void )
  570. {
  571.    int i = 0;
  572.    
  573.    // Open Libraries, Screen & Window:
  574.    if (SetupSystemList( &OpenVecWindow ) < 0)
  575.       {
  576.       fprintf( stderr, "Couldn't open a System ListViewer!\n" );
  577.       return( -1 );
  578.       }
  579.    
  580.    SetNotifyWindow( VecWnd );
  581.  
  582.    lvm.lvm_NodeStrs   = &NodeStrs[0];
  583.    lvm.lvm_Nodes      = &VecNodes[0];
  584.    lvm.lvm_NumItems   = MAXNODES;
  585.    lvm.lvm_NodeLength = NODELENGTH;
  586.  
  587.    SetupList( &VecList, &lvm );   
  588.  
  589.    strcpy( VecNodes[0].ln_Name, tstr );
  590.  
  591.    HideListFromView( VecGadgets[ VLV ], VecWnd );
  592.  
  593.    SetupVectorList(); // Make the list.
  594.  
  595.    ModifyListView( VecGadgets[ VLV ], VecWnd, 
  596.                    (struct List *) &VecList, NULL
  597.                  );
  598.  
  599.    GT_RefreshWindow( VecWnd, NULL );
  600.  
  601.    (void) HandleVecIDCMP();
  602.    
  603.    // Close Libraries, Screen & Window:
  604.    ShutdownSystemList();
  605.  
  606.    return( 0 );
  607. }
  608.  
  609.  
  610. PUBLIC int ShowVectors( void )
  611. {
  612.    int rval = 0;
  613.  
  614.    rval = HandleVectorLV();
  615.    
  616.    return( rval );
  617. }
  618.  
  619. #ifdef DEBUG
  620.  
  621. PUBLIC int main( void )
  622. {
  623.    return( ShowVectors() );
  624. }
  625.  
  626. #endif
  627.  
  628. /* ------------------ END of SysVectors.c file! ---------------------- */
  629.